home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / tool_inc.zip / INTRCOMM.INT < prev    next >
Text File  |  1989-08-20  |  6KB  |  173 lines

  1.  
  2. (*
  3.  * Copyright 1987, 1989 Samuel H. Smith;  All rights reserved
  4.  *
  5.  * This is a component of the ProDoor System.
  6.  * Do not distribute modified versions without my permission.
  7.  * Do not remove or alter this notice or any other copyright notice.
  8.  * If you use this in your own program you must distribute source code.
  9.  * Do not use any of this in a commercial product.
  10.  *
  11.  *)
  12.  
  13. const
  14.    carrier_lost = #$E3;              (* code returned with carrier is lost *)
  15.  
  16.    com_current_chan: integer = 0;    (* current communication channel *)
  17.  
  18.    port_base:    integer = -1;  (* base port number for 8250 chip *)
  19.                                 (* value = -1 until init is finished *)
  20.  
  21.    port_irq:     integer = -1;  (* port irq number *)
  22.  
  23.    old_vector:   pointer = nil; (* pointer to original com interrupt handler *)
  24.    
  25.    XOFF_char:    char = ^S;     (* XOFF character code *)
  26.  
  27.    disable_cts_check: boolean = false; {false if RTS handshake is needed}
  28.    even_parity:   boolean = false; {strip parity?}
  29.  
  30.  
  31.  
  32. var
  33.    port_intr:    integer;       (* interrupt number for 8250 chip *)
  34.    intr_mask:    integer;       (* interrupt controller initialization code *)
  35.  
  36.    prev_LCR:     integer;       (* previous LCR contents *)
  37.    prev_IER:     integer;       (* previous IER contents *)
  38.    prev_MCR:     integer;       (* previous MCR contents *)
  39.    prev_ICTL:    integer;       (* previous ICTL contents *)
  40.  
  41.    xmit_active:  boolean;       (* is the transmitter active now?
  42.                                    (is a THRE interrupt expected?) *)
  43.  
  44.    XOFF_active:  boolean;       (* has XOFF suspended transmit? *)
  45.  
  46.    rxque:        queue_rec;     (* receive data queue *)
  47.    txque:        queue_rec;     (* transmit data queue *)
  48.  
  49.    reg:          registers;     (* register package *)
  50.  
  51.    bios_bastab:  array[0..3] of word absolute $40:0;
  52.                                 (* bios table of com port bases for each
  53.                                    port com1..com4 *)
  54.  
  55.  
  56. (*
  57.  * Uart register definitions
  58.  *
  59.  *)
  60.  
  61. const
  62.    ICTL = $21;                  (* system interrupt controller i/o port *)
  63.  
  64.    RBR = 0;  (* receive buffer register *)
  65.    THR = 0;  (* transmit holding register *)
  66.  
  67.    DLM = 1;  (* divisor latch MSB *)
  68.    IER = 1;  (* interrupt enable register *)
  69.       IER_DAV     = $01;       (* data available interrupt *)
  70.       IER_THRE    = $02;       (* THR empty interrupt *)
  71.       IER_LSRC    = $04;       (* line status change interrupt *)
  72.       IER_MSR     = $08;       (* modem status interrupt *)
  73.  
  74.  
  75.    IIR = 2;  (* interrupt identification register *)
  76.       IIR_PENDING = $01;       (* low when interrupt pending *)
  77.  
  78.       IIR_MASK    = $06;       (* mask for interrupt identification *)
  79.         IIR_MSR     = $00;       (* modem status change interrupt *)
  80.         IIR_THRE    = $02;       (* transmit holding reg empty interrupt *)
  81.         IIR_DAV     = $04;       (* data available interrupt *)
  82.         IIR_LSR     = $06;       (* line status change interrupt *)
  83.  
  84.  
  85.    LCR = 3;  (* line control register *)
  86.       LCR_5BITS   = $00;       (* 5 data bits *)
  87.       LCR_7BITS   = $02;       (* 7 data bits *)
  88.       LCR_8BITS   = $03;       (* 8 data bits *)
  89.  
  90.       LCR_1STOP   = $00;       (* 1 stop bit *)
  91.       LCR_2STOP   = $04;       (* 2 stop bits *)
  92.  
  93.       LCR_NPARITY = $00;       (* no parity *)
  94.       LCR_EPARITY = $38;       (* even parity *)
  95.  
  96.       LCR_NOBREAK = $00;       (* break disabled *)
  97.       LCR_BREAK   = $40;       (* break enabled *)
  98.  
  99.      {LCR_NORMAL  = $00;}      (* normal *)
  100.       LCR_ABDL    = $80;       (* address baud divisor latch *)
  101.  
  102.  
  103.    MCR = 4;  (* modem control register *)
  104.       MCR_DTR     = $01;       (* active DTR *)
  105.       MCR_RTS     = $02;       (* active RTS *)
  106.       MCR_OUT1    = $04;       (* enable OUT1 *)
  107.       MCR_OUT2    = $08;       (* enable OUT2 -- COM INTERRUPT ENABLE *)
  108.       MCR_LOOP    = $10;       (* loopback mode *)
  109.  
  110.  
  111.    LSR = 5;  (* line status register *)
  112.      LSR_DAV      = $01;       (* data available *)
  113.      LSR_OERR     = $02;       (* overrun error *)
  114.      LSR_PERR     = $04;       (* parity error *)
  115.      LSR_FERR     = $08;       (* framing error *)
  116.      LSR_BREAK    = $10;       (* break received *)
  117.      LSR_THRE     = $20;       (* THR empty *)
  118.      LSR_TSRE     = $40;       (* transmit shift register empty *)
  119.  
  120.      LOERR_count:       integer = 0;    {overrun error count}
  121.      LPERR_count:       integer = 0;    {parity error count}
  122.      LFERR_count:       integer = 0;    {framing error count}
  123.      LBREAK_count:      integer = 0;    {break received count}
  124.  
  125.  
  126.    MSR = 6;  (* modem status register *)
  127.      MSR_DCTS     = $01;       (* delta CTS *)
  128.      MSR_DDSR     = $02;       (* delta DSR *)
  129.      MSR_DRING    = $04;       (* delta ring *)
  130.      MSR_DRLSD    = $08;       (* delta receive line signal detect *)
  131.      MSR_CTS      = $10;       (* clear to send *)
  132.      MSR_DSR      = $20;       (* data set ready *)
  133.      MSR_RING     = $40;       (* ring detect *)
  134.      MSR_RLSD     = $80;       (* receive line signal detect *)
  135.  
  136.  
  137.    COM_BASE_TABLE: ARRAY[0..2] OF WORD = ($3F8,$2F8,$3E8);
  138.    COM_IRQ_TABLE:  ARRAY[0..2] OF BYTE = (4, 3, 4);
  139.  
  140.    IRQ_MASK_TABLE: ARRAY[0..7] OF BYTE = ($01,$02,$04,$08,$10,$20,$40,$80);
  141.    IRQ_VECT_TABLE: ARRAY[0..7] OF BYTE = ($08,$09,$0A,$0B,$0C,$0D,$0E,$0F);
  142.  
  143.  
  144. procedure disable_int;
  145.    inline($FA);
  146.  
  147. procedure enable_int;
  148.    inline($FB);
  149.  
  150. procedure io_delay;
  151.    inline($EB/$00);     {jmp $+2}
  152.  
  153. procedure INTR_service_transmit;
  154. procedure INTR_poll_transmit;
  155. procedure INTR_service_receive;
  156. procedure INTR_check_interrupts;
  157.  
  158. procedure cancel_xoff;
  159. procedure control_k;
  160. procedure INTR_lower_dtr;
  161. procedure INTR_raise_dtr;
  162. procedure INTR_select_port(chan: integer);
  163. procedure INTR_init_com(chan: integer);
  164. procedure INTR_uninit_com;
  165. procedure INTR_set_baud_rate(speed: word);
  166.  
  167. procedure INTR_flush_com;
  168. procedure INTR_transmit_data(s:    longstring);
  169. function  INTR_receive_ready: boolean;
  170. function  INTR_receive_data:  char;
  171. procedure verify_txque_space;
  172.  
  173.